iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
1
自我挑戰組

30天學python系列 第 7

[Day07] 字串和常用數據結構

  • 分享至 

  • xImage
  •  

練習

練習1 - 顯示跑馬燈文字。

import os
import time

def main():
    content = '我要成功挑戰IT鐵人賽'
    while True:
        
        os.system('cls')  # 清理屏幕上的輸出 (on windows)
        #os.system('clear') 清理屏幕上的輸出 (on linux / os x)
        print(content)
        
        time.sleep(0.2)   # 休眠200毫秒 (使得印出時間變慢)
        content = content[1:] + content[0]  # 將字串串連起來

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116pBBTyFrzdl.png https://ithelp.ithome.com.tw/upload/images/20190922/20121116hFh2dVzLx7.png
想更清楚知道效果,可以複製程式碼自己試試看。
練習2 - 產生指定長度的驗證碼,驗證碼由大小寫字母和數字構成。

import random

def generate_code (code_len = 4):  # 可設定驗證碼長度,默認值為 4

    all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_chars) - 1 # 計算全部字元的長度
    code = ''
    for i in range (code_len):
        index = random.randint(0, last_pos) # 隨機產生 0 ~ 61 的數
        code += all_chars[index]            # 將隨機產生 0 ~ 61 的數代入字元裡 
    return code
    
def main() :
    print(generate_code())
    print(generate_code(5))
    print(generate_code(7))
    print(generate_code(2))
    
if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/201211164OgT0H5AWV.png
練習3 - 輸出給定文件名的檔案類型文字。

def get_suffix (filename, has_dot=False):

    # filename : 文件名 has_dot : 返回的檔案型態文字是否需要带點
    pos = filename.rfind('.')       # 找到文件名中'.'的位置
    if 0 < pos < len(filename) - 1:
        index = pos if has_dot else pos + 1    
        return filename[index:]     # 文件名中點或點 + 1 後的所有文字
    else:
        return ''
        
def main() :
    print(get_suffix('name.py',True))
    print(get_suffix('picture.png',False))

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/201211161U8mB4j03i.png
練習4 - 輸出傳入的列表中最大和第二大的元素的值。

def max2(x):
    m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for index in range(2, len(x)):
        if x[index] > m1:   # 判斷最大的元素
            m2 = m1
            m1 = x[index]
        elif x[index] > m2: # 判斷第二大的元素
            m2 = x[index]
    return m1, m2
    
def main() :
    print(max2('qazwsxedc'))
    print(max2('abcdefgh'))

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/2012111661evBT3vBt.png
練習5 - 計算指定的年月日是這一年的第幾天。

def is_leap_year (year):  # 判斷是否為閏年
    
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0

def which_day (year, month, date):
    # python 的 bool,也就是 True 和 False,實質上是 int,也就是 1 和 0
    # True = 1,False = 0
    # 函數返回 True 即為返回 list[1],反之 list[0]
    days_of_month = [ 
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        ] [is_leap_year(year)]
    total = 0
    for index in range (month - 1):
        total += days_of_month[index]
    return total + date

def main():
    print(which_day(1980, 11, 28))
    print(which_day(1981, 12, 31))
    print(which_day(2018, 1, 1))
    print(which_day(2016, 3, 1))

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116tgImH5GYa3.png
練習6 - 輸出巴斯卡三角形,是二項式係數的一種寫法。

def main():
    num = int(input('Number of rows: '))
    yh = [[]] * num                     # 在一個串列中建立指定列數的空串列
    for row in range (len(yh)):
        yh[row] = [None] * (row + 1)    # 將串列中每個空串列所需要的元素設為 None
        for col in range (len(yh[row])):
            if col == 0 or col == row:  # 判斷串列中每個串列的頭和尾並將其設為 1
                yh[row][col] = 1
            else:                 # 其餘的值為上一列同一行的值 + 上一列前一行的值 
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print(yh[row][col], end = '\t')
        print()

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116z4ZPec3fLH.png

綜合練習

練習1 - 雙色球選號。

from random import randrange, randint, sample

def display (balls):                     # 輸出雙色球選號
    # enumerate 函數能同時列出串列中的元素的數據和位置
    for index, ball in enumerate(balls): 
        if index == len(balls) - 1:      # 在最後一個數據前印出 '|'
            print('|', end =' ')
        print('%02d' % ball, end =' ')
    print()

def random_select():                      # 隨機選擇一組號碼
    
    red_balls = [x for x in range(1, 34)] 
    selected_balls = []                   
    # sample 函數用意為從列表中選擇不重複 n 個元素
    selected_balls = sample(red_balls, 6) 
    selected_balls.sort()                 # 將產生的 6 個隨機數排序
    selected_balls.append(randint(1, 16)) # 加入隨機產生 1 ~ 16 的數
    return selected_balls

def main():
    n = int(input('輸入選擇下注的數量: '))
    for _ in range(n):
        display(random_select())

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116zTqdSFhera.png
https://ithelp.ithome.com.tw/upload/images/20190922/20121116iFtofU7EQP.png
練習2 - 約瑟夫環問題。
《幸運的基督徒》
有 15 個基督徒和 15 個非基督徒在海上遇險,為了能讓一部分人活下來不得不將其中 15 個人扔到海裡面去,有個人想了個辦法就是大家圍成一個圈,由某個人開始從 1 報數,報到 9 的人就扔到海裡面,他後面的人接著從 1 開始報數,報到 9 的人繼續扔到海裡面,直到扔掉 15 個人。
由於上帝的保佑,15 個基督徒都倖免於難,問這些人最開始是怎麼站的,哪些位置是基督徒哪些位置是非基督徒。

def main():
    persons = [True] * 30
    counter, index, number = 0, 0, 0
    while counter < 15:
        if persons[index]:
            number += 1
            if number == 9:
                persons[index] = False  # 將每一數的第 9 個人數為 False
                counter += 1
                number = 0
        index += 1
        index %= 30           # 固定每 30 一數,當 index = 30時,變成 index = 0
    for person in persons:
        print('基' if person else '非', end =' ')

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116rbQkwlEn81.png
練習3 - 井字遊戲。

import os,random

def print_board(board):         # 輸出井字的樣子
    print(board['1'] + ' | ' + board['2'] + ' | ' + board['3'])
    print('--+---+--')
    print(board['4'] + ' | ' + board['5'] + ' | ' + board['6'])
    print('--+---+--')
    print(board['7'] + ' | ' + board['8'] + ' | ' + board['9'])

def main():
    init_board = {
        '1': ' ', '2': ' ', '3': ' ',
        '4': ' ', '5': ' ', '6': ' ',
        '7': ' ', '8': ' ', '9': ' ' }
    begin = True
    while begin:
        curr_board = init_board.copy()  # 複製初始的空字典
        begin = False
        turn = random.choice(['x','o']) # 隨機讓兩者開始
        counter = 0
        print_board(curr_board)
        while counter < 9:
            move = input('輪到 %s ,請輸入位置: ' % turn)
            if curr_board[move] == ' ': # 判斷位置是否為' ',空則記錄現在的 turn
                counter += 1
                curr_board[move] = turn 
                if turn == 'x':
                    turn = 'o'
                else:
                    turn = 'x'
            print_board(curr_board)
        choice = input('再玩一局 ? (yes | no) ')
        begin = choice == 'yes'

if __name__ == '__main__':
    main()

https://ithelp.ithome.com.tw/upload/images/20190922/20121116zs9j3I0hom.png ! https://ithelp.ithome.com.tw/upload/images/20190922/20121116BGUXgMkPMA.png


上一篇
[Day06] 字串和常用數據結構
下一篇
[Day08] 物件導向編程基礎
系列文
30天學python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言